// @ts-nocheck
import { Duplex } from "stream";
import { EventEmitter } from "events";
import { JSONRPCStream } from "./jsonrpc";
import * as msgpack from "@msgpack/msgpack";

interface WAChatEvents {
  ["error"]: [error: Error];
  ["close"]: [errord: boolean];

  ["login"]: [];
  ["logout"]: [];
  ["qrcode"]: [code: string];
  ["authorized"]: [];
  //...
}

export class WAChat extends EventEmitter<WAChatEvents> {
  public readonly jsonrpc: JSONRPCStream;
  public callback: any;

  // 构造函数，接收一个Duplex类型的参数stream
  constructor(stream: Duplex, callback: any) {
    stream.on("data", (data: any) => {
      console.log("收到数据:", data);
      try {
        if (Buffer.isBuffer(data)) {
          // 尝试解析为 JSON
          try {
            const jsonStr = data.toString("utf-8");
            const jsonData = JSON.parse(jsonStr);
            console.log("JSON 数据:", jsonData);
            return;
          } catch (e) {
            // 不是 JSON 格式，继续尝试其他格式
          }

          // 尝试 msgpack 解码
          try {
            const msgpackData = msgpack.decode(data);
            console.log("MessagePack 数据:", msgpackData);
            this.callback(msgpackData);
            return;
          } catch (e) {
            // 不是 msgpack 格式，继续尝试其他格式
          }

          // 尝试解析为普通文本
          const textData = data.toString("utf-8");
          console.log("文本数据:", textData);
        } else if (data instanceof Uint8Array) {
          const decodedData = msgpack.decode(data);
          console.log(decodedData, "解码消息");
          this.callback(decodedData);
        } else {
          // 如果不是 Uint8Array，可能是其他格式的数据
          console.log("非二进制数据:", data);
        }
      } catch (error) {
        console.error("解码失败:", error);
        // 可以尝试使用 TextDecoder 来查看原始数据
        try {
          const textData = new TextDecoder().decode(data);
          console.log("原始文本数据:", textData);
        } catch (e) {
          console.error("无法解析为文本:", e);
        }
      }
    });

    stream.on("qrcode", (data: Buffer) => {
      console.log("收到子流消息qrcode:", data);
    });

    // 调用父类的构造函数
    super();
    this.callback = callback;
    // 创建一个JSONRPCStream对象，传入stream参数
    this.jsonrpc = new JSONRPCStream(stream);
    // 添加一个名为login的方法，当调用该方法时，触发login事件
    this.jsonrpc.addMethod("login", () => this.emit("login"));
    // 添加一个名为qrcode的方法，当调用该方法时，触发qrcode事件，并传入qrcode参数
    this.jsonrpc.addMethod("qrcode", (qrcode) => this.emit("qrcode", qrcode));
    // 开始监听
    this.jsonrpc.listen();
  }

  async requestPairingCode(phoneNumber: string): Promise<string> {
    return await this.jsonrpc.request("requestPairingCode", phoneNumber);
  }
}
